package awareness;

import java.util.Properties;

import collaboration.MIApplication;
import collaboration.MIUser;
import events.EventHandler;

public class Subsystem {
	
	public static EventHandler EVENT_HANDLER; /**< Manejador de eventos usado globalmente */
	public static MIServiceConnector MI_SERVICE_CONNECTOR; /**< Conector con el servicio de metainformacion */
	private static MIClient mi_client;
	private static org.omg.CORBA.ORB orb;
	
	/**
	* Inicializa el sistema de colaboracion. Una vez inicializado,
	* se podra hacer uso adecuadamente de la variable compartida "event_handler"
	*
	* @param args Argumentos introducidos por el terminal
	* @return True si se inicializo el sistema de colaboracion. False
	*         en caso contrario.
	*
	* @post El sistema de colaboracion quedara inicializado y la variable global
	*       "event_handler" se inicializara debidamente.
	*/
	public static boolean setup_environment(String[] args)
	{
		try{
			orb = org.omg.CORBA.ORB.init(args, null);
			EVENT_HANDLER = new EventHandler(orb);
			mi_client = new MIClient(orb);
		}
		catch(Exception ex)
		{
			ex.printStackTrace();
			return false;
		}
		
		return true;
	}
	
	/**
	* Destruye el sistema de colaboracion y la variable compartida
	* "event_handler". Si no se ha llamado a la funcion 
	* @see setup_environment entonces el comportamiento
	* es totalmente inesperado.
	*
	* @pre Se debe haber llamado a la funcion @see setup_environment
	* @post El sistema de colaboracion y la variable compartida "event_handler"
	*       seran destruidos.
	*/
	public static void shutdown_environment()
	{
		orb.destroy();
	}
	
	/**
	* Inicializa el conector con el servicio de metainformacion. Previamente
	* debera haberse llamado a la funcion @see setup_environment.
	*
	* @param app Aplicacion
	* @param user Usuario
	* @param password Clave
	* @return True si se inicializo el conector con el servicio de metainformacion
	*        correctamente. False en caso contrario.
	*
	* @pre Se debe haber llamado a la funcion @see setup_environment
	* @post La variable compartida "mi_service_connector" quedara inicializada
	*/
	public static boolean setup_MIServiceConnector(String app, String user, String password)
	{
		if ( (EVENT_HANDLER != null) && (mi_client != null) )
		{
			MI_SERVICE_CONNECTOR = new MIServiceConnector(app, user, password, 
														EVENT_HANDLER, mi_client);
														
			return true;
		}
		else
		{
			return false;
		}
	}
	
	/**
	* Obtiene la lista de aplicaciones del sistema
	*
	* @return Lista de aplicaciones del sistema. Si no se ha inicializado
	*         el sistema de colaboracion, entonces se devuelve NULL.
	*/
	public static MIApplication[] get_applications()
	{
		if (mi_client != null)
			return mi_client.applications();
			
		else return null;
	}
	
	/**
	* Obtiene la lista de usuarios de una aplicacion
	*
	* @param app Aplicacion
	* @return Lista de usuarios de la aplicacion
	*/
	public static MIUser[] get_users(String app)
	{
		if (mi_client != null)
			return mi_client.users(app);
			
		else return null;
	}
}
